Racket list
Racket 是 Lisp 语言的一种方言,常用于教学。它的特点是强大的宏系统和模块化支持,以及丰富的库函数,可以很方便地编写各种复杂的程序。其中,List(列表)是 Racket 中最基础和重要的数据结构之一,我们在本文中将详细介绍。
List 基础
在 Racket 中,列表是有序的元素集合。你可以将它想象成一个链表。一个空的列表可以用 '()
表示,也可以用内建函数 empty
表示。非空的列表由一个或多个元素和一个空列表组成。
创建 List
list
我们可以用 list
函数创建一个新的列表。例如:
; 创建一个新的列表 [1, 2, 3]
(define my-list (list 1 2 3))
你也可以用 '
符号来创建一个列表:
; 创建一个新的列表 [1, 2, 3]
(define my-list '(1 2 3))
make-list
Another way to make lists is using the make-list function:
> (make-list 10 'me)
'(me me me me me me me me me me)
As you can see, make-list takes a number and a value, and makes a list that contains that value repeated that number of times.
访问 List
要访问列表的元素,我们可以使用 first
函数获取第一个元素,使用 rest
函数获取剩下的元素(返回的仍然是一个列表):
(define my-list (list 1 2 3))
; 返回 1
(first my-list)
; 返回 (list 2 3)
(rest my-list)
List 操作
添加元素
要在列表前添加一个元素,我们可以使用 cons
函数:
(define my-list (list 1 2 3))
; 新的列表为 [0, 1, 2, 3]
(define new-list (cons 0 my-list))
删除元素
要删除列表的第一个元素,我们可以使用 rest
函数:
(define my-list (list 1 2 3))
; 新的列表为 [2, 3]
(define new-list (rest my-list))
反转列表
If you need the elements in a list reversed, you can use the reverse function.
> (reverse '(1 2 3 4 5))
; reverse elements of a list
'(5 4 3 2 1)
列表排序
The sort function will sort a list. You can pass in < to sort the list in ascending order:
> (sort '(1 3 6 5 7 9 2 4 8) <)
'(1 2 3 4 5 6 7 8 9)
Or, if you pass in >, it will sort the list in descending order:
> (sort '(1 3 6 5 7 9 2 4 8) >)
> '(9 8 7 6 5 4 3 2 1)
连接列表
要连接两个列表,我们可以使用 append
函数:
(define list1 (list 1 2 3))
(define list2 (list 4 5 6))
; 新的列表为 [1, 2, 3, 4, 5, 6]
(define new-list (append list1 list2))
也支持多个拼接:
> (append '(1 2) '(3 4) '(5 6))
'(1 2 3 4 5 6)
列表长度
要获取列表的长度,我们可以使用 length
函数:
(define my-list (list 1 2 3))
; 返回 3
(length my-list)
range
The range function will create a list of numbers given some specifications. You can pass a start value and an end value, as well as a step to increment:
> (range 0 10 2)
'(0 2 4 6 8)
Or, if you just pass an end value, it will start at 0 with a step of 1:
> (range 10)
'(0 1 2 3 4 5 6 7 8 9)
member
Another way to search lists is to use member, which tests whether a list contains an instance of a particular element. It returns the symbol #f
if it does not, and returns the tail of the list starting with the first instance of the
matching element if it does.
> (member 7 '(9 3 5 (6 2) 5 1 4))
#f
> (member 5 '(9 3 5 (6 2) 5 1 4))
'(5 (6 2) 5 1 4)
> (member 6 '(9 3 5 (6 2) 5 1 4))
#f
Notice that in the last instance, even though 6 is a member of a sublist of the searched list, the member function still returns false. However, the following does work.
> (member '(6 2) '(9 3 5 (6 2) 5 1 4))
'((6 2) 5 1 4)
遍历 List
Racket 提供了几种基础的遍历列表的方式。
使用 for
循环
(define my-list (list 1 2 3))
(for ([i my-list])
; 打印 1, 2, 3
(displayln i))
使用 map
函数
map
函数接受一个函数和一个或多个列表,它将这个函数应用到每一个列表元素上,并返回一个新的列表:
(define my-list (list 1 2 3))
; 新的列表为 [2, 3, 4]
(define new-list (map add1 my-list))
使用 filter
函数
filter
函数接受一个函数和一个列表,它将这个函数应用到每一个列表元素上,并返回一个只包含使得这个函数返回真的元素的新列表:
(define my-list (list 1 2 3 4 5))
; 新的列表为 [1, 3, 5]
(define new-list (filter odd? my-list))
index-of
If you need to search a list for a value, you can use index-of. It’ll return the index of the value if it appears:
> (index-of '(8 7 1 9 5 2) 9)
3
It’ll return #f
if it doesn’t:
> (index-of '(8 7 1 9 5 2) 10)
#f
判断
列表是否为空
To test whether a list is empty or not, you can use the null? function:
> (null? '())
; test for empty list
#t
> (null? '(1 2 3))
#f
最大最小
最小
在 Racket 语言中,你可以使用 apply
函数和 min
函数来获取 List 的最小值。例如,如果你有一个名为 my-list
的 List,你可以使用以下代码来获取它的最小值:
(apply min my-list)
本文作者:Maeiee
本文链接:Racket list
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!